package c03数据类型和运算符;

public class 字符串intern研究 {

	public static void main(String[] args) {
		String s1 = new String("a");//先往常量池(字符串常量池)创建"ab", 再在堆创建字符串对象
		s1.intern();
		String s2 = "a";
		System.err.println(s1==s2);
		//jdk6: false: intern()尝试往常量池拷贝s1的副本, 发现已存在"a", 失败, 最终s1和s2引用不同对象, false!
		//jdk6+: false: intern()尝试往常量池拷贝s1的引用, 发现已存在"a", 失败, 最终s1和s2引用不同对象, false!

		String s3 = new String("a") + new String("a");//这一步不会往常量池创建"aa", 因此这一步后常量池并没有"aa"!
		s3.intern();
		String s4 = "aa";
		//jdk6: false: 还是拷副本, 成功, 最终s3和s4还是不同对象, false!
		//jdk6+: true: 还是拷引用, 成功, 最终s3和s4都是指向堆中同一个对象, true!
		System.err.println(s3==s4);
	}

}
